package com.itheima.collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.ConcurrentModificationException;
import java.util.Iterator;

/*需求：创建一个Collection集合存储学生对象的集合，存储3个学生对象，使用程序实现在控制台遍历该集合
        思路：
        ① 定义学生类
        ② 创建Collection集合对象
        ③ 创建学生对象
        ④ 把学生添加到集合
        ⑤ 遍历集合(迭代器方式)*/
public class CollectionDemo {
    public static void main(String[] args)throws ConcurrentModificationException {
        Collection<Student> collection=new ArrayList<>();
        collection.add(new Student("yyds",18));
        collection.add(new Student("er",22));
        collection.add(new Student("san",33));
        removeStudent(collection);
        Iterator<Student> iterator=collection.iterator();
        /*for (int i = 0; i < collection.size(); i++) {
            System.out.println(iterator.next());
        }*/
       /* for (Student student:collection){
            System.out.println(student);
        }*/
       // removeStudent(collection);
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
        System.out.println(collection);
/*当不允许这样的修改时，可以通过检测到对象的并发修改的方法来抛出此异常。
        例如，一个线程通常不允许修改集合，而另一个线程正在遍历它。 一般来说，在这种情况下，迭代的结果是未定义的。
        某些迭代器实现（包括由JRE提供的所有通用集合实现的实现）可能会选择在检测到此行为时抛出此异常。 这样做的迭代器被称为故障快速迭代器，
        因为它们快速而干净地失败，而是在未来未确定的时间冒着任意的非确定性行为。
        请注意，此异常并不总是表示对象已被不同的线程同时修改。 如果单个线程发出违反对象合同的方法调用序列，则该对象可能会抛出此异常。
        例如，如果线程在使用故障快速迭代器迭代集合时直接修改集合，则迭代器将抛出此异常。
        请注意，故障快速行为无法保证，因为一般来说，在不同步并发修改的情况下，无法做出任何硬性保证。
        失败快速的操作ConcurrentModificationException抛出ConcurrentModificationException 。
        因此，编写依赖于此异常的程序的正确性将是错误的： ConcurrentModificationException应仅用于检测错误。
*/

    }

    private static void removeStudent(Collection<Student> collection) {
        collection.removeIf(
                (Student s)-> s.getName().length()==3
        ) ;
    }
}
